前面我們雖然有講到除了基本的數值類型資料以外,一共主要會有文字、圖片、聲音這三大類型,而在數值類型的資料裡面還有一種特別的類型是(時間)序列型的資料
import twstock
stock = twstock.Stock("0050")
price = np.array(stock.price)
date = stock.date
plt.plot(date,price)
plt.xticks(rotation = 30)
plt.title("0050")
以股票資料為例,我們當然會希望找出價格的高點,那對於一個序列類型的資料要怎麼找出它的高點呢?這邊我們可以使用scipy
的套件來做到這件事情
# 尋找峰值
from scipy.signal import argrelextrema
max_index = argrelextrema(price, np.greater)[0]
peak = price[max_index]
print(f"peak:{peak}")
peak:[141. 142.55 141.95 141.6 140.5 140. 137.05 135.35]
# 繪圖峰值
plt.plot(date,price)
plt.xticks(rotation = 30)
for index in max_index:
plt.scatter(date[index],price[index],c="r")
plt.show()
而因為時間序列類型的資料經常伴隨著噪聲,通常一個可以同時儘量維持序列的趨勢卻又可以一定程度的去除掉它局部的噪音影響
# 計算移動平均
series_price = pd.Series(price)
series_price_ma3 = series_price.rolling(3).mean()
series_price_ma5 = series_price.rolling(5).mean()
# 移動平均繪圖比較
p1 = plt.plot(date,series_price)
p2 = plt.plot(date,series_price_ma3)
p3 = plt.plot(date,series_price_ma5,c="r")
plt.legend(['origin', '3 day MA', "5 day MA"])
plt.xticks(rotation = 30)
plt.title("0050")
然後這個技巧倒不一定是序列類型資料專用,不過對於需要簡單的用線性模型去擬合一串點的時候還是挺好用的,這邊我們用numpy.polyfit
來做到這件事情
# 取出np類型的資料
y = np.array(series_price_ma5)[4:]
x = np.array(range(len(y)))
# 用polyfit去擬合曲線
parameter=np.polyfit(x,y,10) # 以一個10次方程去擬合
parameter_fn=np.poly1d(parameter)
plt.plot(parameter_fn(x),c="r",linestyle="--")
plt.plot(x,y)